package com.insta.bankSystem;

import java.util.*;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */



/**
 * Class Bank, implémentée en tant que Singleton
 * 
 * La définition de la design-pattern "Singleton" est :
 *      
 *      " Une classe dont seule une instance peut exister, et 
 *        qui fournit un point d'accès global à cette instance".
 */
public class Bank
{
  
    private String _street;
    private String _country;
    private String _city;
    private String _zipCode;
    
    private ArrayList<AccountBase> _accounts;

    

    /***************************************************************************
     * 
     * Singleton implementation
     * 
     **************************************************************************/
    
   // 1 :  On déclare une variable statique du meme type que la classe.
   //     Cette variable contiendra l'instance unique de la classe.
    private static Bank _instance = null;
    
    // 2 :  On crée un ou plusieurs constructeurs, mais tous inacessibles
    //      depuis l'extérieur de la classe (donc, soit private, soit protected).
    private Bank()
    {}
    
    // 3 :  On crée la méthode qui renvoie l'instance unique de la classe (i.e.
    //      le point d'accès global à l'instance.
    public static Bank getInstance()
    {
        // Si c'est le 1er appel à cette méthode..
        if (_instance == null)
        {
            // On instancie une fois la classe Bank et l'on stocke cette
            // instance dans la variable de niveau classe "_instance".
            _instance = new Bank();
        }
        
        // et l'on fait renvoyer l'instance précédemment créée..
        return _instance;
    }

    
    public AccountBase Create(Customer customer,double initialDeposit) throws InvalidDepositException
    {
        AccountBase result;
        
        result = AccountFactory.Create(customer, initialDeposit);
        
        _accounts.add(result);
        
        return result;
    }
    
    
    
   /***************************************************************************
    * 
    * Properties getters & setters
    * 
    ***************************************************************************/
    
    /**
     * 
     * @return List of Accounts
     */
    public ArrayList<AccountBase> getAccounts() 
    {
        return _accounts;
    }
    
    
   public String getStreet()
    {
        return _street;
    }

    public void setStreet(String _street)
    {
        this._street = _street;
    }

    
    
    public String getCountry()
    {
        return _country;
    }

    public void setCountry(String _country)
    {
        this._country = _country;
    }

    
    
    public String getCity()
    {
        return _city;
    }

    public void setCity(String _city)
    {
        this._city = _city;
    }

    
    
    public String getZipCode()
    {
        return _zipCode;
    }

    public void setZipCode(String _zipCode)
    {
        this._zipCode = _zipCode;
    }    
    
}
